package matrix;

import java.util.Collection;

/**
 * Интерфейс к области (набору) {@linkplain matrix.ICell Ячеек} (например, матрица, диагональ,строка, колонка,..).
 */
public interface IRange extends Collection<ICell> {
	/**
	 * Возвращает (родительскую) область, содержащую данную
	 * @return {@linkplain matrix.IRange IRange}
	 */
	abstract IRange parent();
	/**
	 * Возвращает номер верхней строки области ячеек, содержащей данную область (привязка к родительской области).
	 * Не может быть меньше 1 и больше {@linkplain matrix.IRange#rows() rows()} {@linkplain matrix.IRange#parent() родительской области}
	 * @return номер верхней строки родительской области
	 * @see matrix.IRange#rows()
	 * @see matrix.IRange#parent()
	 */
	abstract int row();
	/**
	 * Возвращает укзазанную строку
	 * @param aRow номер строки. Не может быть меньше 1 и больше {@linkplain matrix.IRange#rows() rows()} области
	 * @return объект {@linkplain matrix.IRange IRange}, представляющий строку. 
	 * @throws IllegalArgumentException метод должен генерировать эту ошибку если:
	 * (1) aRow меньше 1 или
	 * (2) aRow больше {@linkplain matrix.IRange#rows() rows()}
	 */
	abstract IRange row(int aRow);
	/**
	 * Возвращает номер левой колонки области ячеек, содержащей данную область (привязка к родительской области). 
	 * Не может быть меньше 1 и больше {@linkplain matrix.IRange#columns() columns()} {@linkplain matrix.IRange#parent() родительской области} 
	 * @return номер левой колонки родительской области
	 * @see matrix.IRange#columns()
	 * @see matrix.IRange#parent()
	 */
	abstract int column();
	/**
	 * Возвращает укзазанную колонку
	 * @param aColumn номер колонки. Не может быть меньше 1 и больше {@linkplain matrix.IRange#columns() columns()} области
	 * @return объект {@linkplain matrix.IRange IRange}, представляющий колонку
	 * @throws IllegalArgumentException метод должен генерировать эту ошибку если:
	 * (1) aColumn меньше 1 или
	 * (2) aColumn больше {@linkplain matrix.IRange#columns() columns()}
	 */
	abstract IRange column(int aColumn);
	/**
	 * Возвращает количество строк области ячеек 
	 * @return количество строк
	 */
	abstract int rows();
	/**
	 * Возвращает количество столбцов области ячеек 
	 * @return количество столбцов
	 */
	abstract int columns();
	/**
	 * Возвращает область ячеек внутри данной (родительской) области, заданную строками и колонками
	 * @param tRow верхняя строка родительской {@linkplain matrix.IRange Области}.
	 * @param lColumn левая колонка родительской {@linkplain matrix.IRange Области}
	 * @param aRows - количество строк в выделяемой области
	 * @param aColumns - количество столбцов в выделяемой области 
	 * @return объект {@linkplain matrix.IRange IRange}, представляющий выделенную область ячеек. 
	 * @throws IllegalArgumentException метод должен генерировать эту ошибку если:
	 * (1) tRow или lColumn меньше 1 или
	 * (2) tRow+aRows больше {@linkplain matrix.IRange#rows() rows()} или
	 * (3) lColumn+aColumns больше {@linkplain matrix.IRange#columns() columns()}
	 * @see matrix.IRange#rows()
	 * @see matrix.IRange#columns()
	 */
	abstract IRange range(int tRow, int lColumn, int aRows, int aColumns);
	/**
	 * Возвращает одну ячеку внутри данной области, заданную строкой и колонкой
	 * @param aRow строка. Не может быть меньше 1 и больше {@linkplain matrix.IRange#rows() rows()} данной области
	 * @param aColumn колонка. Не может быть меньше 1 и больше {@linkplain matrix.IRange#columns() columns()} данной области
	 * @return  объект {@linkplain matrix.ICell ICell}, представляющий собой одну ячейку
	 * @throws IllegalArgumentException метод должен генерировать эту ошибку если:
	 * (1) aRow меньше 1 или больше {@linkplain matrix.IRange#rows() rows()}.    
	 * (2) aColumn меньше 1 или больше {@linkplain matrix.IRange#columns() columns()}.    
	 * @see matrix.IRange#rows()
	 * @see matrix.IRange#columns()
	 */
	abstract ICell cell(int aRow, int aColumn);
	
}
